package org.assocsp3.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.assocsp3.dao.GenericDao;
import org.assocsp3.modele.Personne;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.context.annotation.Scope;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * Les mappings sont faits avec des annotations sur la classe Personne
 * Les transaction sont déclarées par des annotations, 
 * Certaines méthodes sont en read-only : 
 * 			optimisation --> amélioration des performances de Hibernate :pas de flush
 */

@Scope(value="singleton")
public class PersonneDaoImpl extends HibernateDaoSupport implements GenericDao<Personne>{

	
	public void add(Personne o) {
		// IdTransferringMergeEventListener on our SessionFactory.
		getHibernateTemplate().merge(o);		
	}
	
	public void update(Personne o) {
		getHibernateTemplate().update(o);
	} 

	public void delete(Personne o) {
		getHibernateTemplate().delete(o);
		
	}

	public Personne load(int id,String islazy) {
		final String findById = "from Personne p where p.id = "+id;
		
		/* initialisation de l'objet sans ces associations*/
		if(!islazy.toLowerCase().equals("eager"))
			return (Personne) getSession().createQuery(findById).uniqueResult();
		
    	/*  initialisation selon les associations voulues
         * 	ici les activites --> Hibernate.initialize(a.getActivites());
         */
        return (Personne) getHibernateTemplate().execute(new HibernateCallback() {
            
            public Object doInHibernate(Session session) throws HibernateException,
                    SQLException {
                Query query = session.createQuery(findById);
                Personne p = (Personne) query.uniqueResult();
                Hibernate.initialize(p.getActivites());
                return p;
            }
        });		
	}
	
    public Personne loadByName(final String login,String islazy) {		
    	final String findByLogin = "from Personne p where p.login = \'"+login+"\'";
		
    	/* initialisation de l'objet sans ces associations*/
    	if(!islazy.toLowerCase().equals("eager"))
    		return (Personne) getSession().createQuery(findByLogin).uniqueResult();
    	
    	/*  initialisation selon les associations voulues
         * 	ici les activites --> Hibernate.initialize(a.getActivites());
         */
    	return (Personne) getHibernateTemplate().execute(new HibernateCallback() {           
            public Object doInHibernate(Session session) throws HibernateException,
                    SQLException {
                Query query = session.createQuery(findByLogin);
                Personne p = (Personne) query.uniqueResult();
                Hibernate.initialize(p.getActivites());
                return p;
            }
        });
    } 
	
	@SuppressWarnings("unchecked")
	public List<Personne> loadAll() {
		return getSession().createQuery("from Personne p order by p.nom, p.prenom").list();
	}
        
}
